package com.stt.factory;

import com.stt.builder.CharacterBuilder;
import com.stt.prototype.CharacterPrototype;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.util.Map;

/**
 * 角色工厂类
 * 负责创建和管理角色实例
 * 结合建造者模式和原型模式
 *
 * @author Your Name
 * @version 1.0
 */
@Component
public class CharacterFactory {
    
    /**
     * 角色建造者映射
     * key: 建造者名称（如：warriorBuilder）
     * value: 对应的建造者实例
     */
    @Autowired
    private Map<String, CharacterBuilder> builderMap;
    
    /**
     * 角色原型管理器
     * 用于克隆预设角色模板
     */
    @Autowired
    private CharacterPrototype characterPrototype;
    
    /**
     * 从预设模板克隆角色
     * 
     * @param templateName 模板名称
     * @param newName 新角色名称
     * @return 克隆并重命名后的角色
     */
    public com.stt.model.Character createFromTemplate(String templateName, String newName) {
        com.stt.model.Character character = characterPrototype.cloneCharacter(templateName);
        character.setName(newName);
        return character;
    }
    
    /**
     * 创建角色并可选保存为新模板
     * 
     * @param profession 职业类型
     * @param name 角色名称
     * @param attack 攻击力
     * @param health 生命值
     * @param mana 魔法值
     * @param templateName 可选的模板名称，如果提供则保存为新模板
     * @return 创建的角色实例
     * @throws IllegalArgumentException 如果职业类型无效
     */
    public com.stt.model.Character createCharacter(String profession, String name,
                                   Integer attack, Integer health, Integer mana,
                                   String templateName) {
        CharacterBuilder builder = getBuilder(profession);
        com.stt.model.Character character = builder
            .setBasicInfo(name)
            .setAttack(attack)
            .setHealth(health)
            .setMana(mana)
            .build();
            
        // 如果提供了模板名称，保存为新模板
        if (templateName != null && !templateName.isEmpty()) {
            characterPrototype.addPrototype(templateName, character.clone());
        }
        
        return character;
    }
    
    /**
     * 获取对应职业的建造者
     * 
     * @param profession 职业类型
     * @return 对应的建造者实例
     * @throws IllegalArgumentException 如果找不到对应的建造者
     */
    private CharacterBuilder getBuilder(String profession) {
        String builderName = profession.toLowerCase() + "Builder";
        CharacterBuilder builder = builderMap.get(builderName);
        if (builder == null) {
            throw new IllegalArgumentException("Invalid profession: " + profession);
        }
        return builder;
    }
} 